# 加上连接循环, 1个服务端服务多个客户端

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
phone.bind(("127.0.0.1", 8080))
phone.listen(5)  # 5代表最大挂起的连接数

print("starting...")
while True:  # 链接循环
    # 建立链接
    conn, client_addr = phone.accept()
    print(f"client_addr: {client_addr}")
    # 进行通讯
    while True:  # 通信循环
        try:  # 针对Windows系统，接收空字符串的处理方法
            data = conn.recv(1024)
            # 客户端不允许发送空字符串
            if not data:  # 针对linux系统，接收空字符串的处理方法
                break
            print(f"client data : {data.decode('utf-8')}")
            conn.send(data.upper())
        except ConnectionResetError:
            break

    # 6. 挂电话
    conn.close()

# 7. 关机
phone.close()
